package com.zuoshenge.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitConfig {
    @Bean
    public Queue queue() {
        Map<String, Object> props = new HashMap<>();
        // 消息的生存时间10min，如果过了10min未消费，将会放进死信队列
        // props.put("x-message-ttl", 2000); // 永不过期
        // 设置该队列所关联的死信交换器（当队列消息到期后依然没有消费，则加入死信 队列）
        // 这里设置了死信交换机，死信交换机的名字为ex.course.dlx
        props.put("x-dead-letter-exchange", "ex.course.dlx");
        // 设置该队列所关联的死信交换器的routingKey，如果没有特殊指定，使用原队列的routingKey
        // 生产者发消息时，不会先把消息发给队列，而是发给交换机，交换机根据routingKey决定发送到哪个队列
        // 当消息过期时，消息会根据routingKey的值ex.course.dlx去找到死信交换机ex.course.dlx
        props.put("x-dead-letter-routing-key", "course.dlx");
        // 是否持久化、是否排他、是否自动删除
        Queue queue = new Queue("q.course", false, false, false, props);
        return queue;
    }


    @Bean
    public Exchange exchange() {
        DirectExchange exchange = new DirectExchange("ex.course", false,false, null);
        return exchange;
    }
    /**
     * 死信交换器
     * @return
     */
    @Bean
    public Binding binding() {
//        当消息发送到交换机时，交换机会使用这个路由键来决定应该将消息发送到哪些队列。在这个例子中，路由键是"course"
        return BindingBuilder.bind(queue()).to(exchange()).with("course").noargs();
    }

    @Bean
    public Queue queueDlx() {
        Queue queue = new Queue("q.course.dlx", false, false, false);
        return queue;
    }

    @Bean
    public Exchange exchangeDlx() {
        DirectExchange exchange = new DirectExchange("ex.course.dlx", false,false, null);
        return exchange;
    }

    @Bean
    public Binding bindingDlx() {
        return BindingBuilder.bind(queueDlx()).to(exchangeDlx()).with("course.dlx").noargs();
    }
}
